ホームに戻る
出典 :
関連 :
目次 :
LINQ(Language Integrated Query)とは
C# 3.0から導入された、オブジェクト、データベース、XMLなどのデータ集合に対して、クエリ(問い合わせ)を発行できる仕組みのこと。System.Linq 名前空間に属する。
IEnumerable<T> インタフェースを実装するすべてのオブジェクト(配列、コレクションが該当。シーケンスと総称される)に対してLINQが使用できる。
LINQの機能は「クエリ演算子」によって提供され、これらは IEnumerable<T> に対する拡張メソッドとして定義されている。
メソッドの戻り値もまた IEnumerable<T> であるため、メソッドチェーンが有効である。
LINQとループの比較
// 基となるシーケンス(配列)
int[] seq = {1, 2, 3, 4, 5, 6, 7, 8};
// foreach を用いた場合
int[] mod1 = new int[seq.Length];
int i = 0;
foreach(int s in seq)
{
mod1[i] = s * 3;
}
// LINQ( Select() )を用いた場合
int[] mod2 = seq.Select(s => s * 3).ToArray();
上記の例では、配列 seq の各要素に 3 を乗じた配列 mod1 、mod2 を作成しているが、
LINQを用いた場合は foreach を用いる場合と比較してコードが簡潔であり、配列の初期化やインデクスも不要である。
Select() は写像を行うクエリ演算子である。Select() は引数にラムダ式をとるが、ラムダ式の引数( s )はシーケンス(ここでは seq )の各要素である。
ラムダ式の戻り値( => 演算子の右辺である s * 3 )は写像を行った結果新たに作成されるシーケンスの要素となる。
上記の例では seq 、mod1 、mod2 はいずれも同じ型であるが、写像前後で型が異なっていても構わない。
クエリ式との比較
LINQと同様、
クエリ式でもクエリを実行することができる。
しかしクエリ式はSQLの知識が要求され、記述も煩雑となりがちであるが、LINQはクエリ式の弱点を補うべく開発された経緯から、比較的簡潔に記述できる。
逆にSQLに慣れているのであれば、クエリ式を用いることも選択肢となり得る。
実用例
コレクションから Dictionary を生成する
ToDictionary() メソッドを用いる。

新たに作成する Dictionary のキー、および値それぞれを規定するラムダ式を記述する。
ここで、ラムダ式の引数は基となるコレクションの要素( baseDic の要素である KeyValuePair )である。
KeyValuePair は Key でキー、Value で値を参照できる。
このように、コレクションから Dictionary への転写をループを用いることなく実現できる。
尚、ToDictionary() には複数のオーバーロードが存在する。詳細は割愛。
グループボックス内のチェックされたラジオボタンを取得する

上記例において、groupBox1.Controls は「groupBox1 に含まれるすべてのコントロール」、
OfType<RadioButton>() メソッドにより、「RadioButton」に該当するもののみを抽出している。
ここまでの groupBox1.Controls.OfType<RadioButton>() がLINQの対象シーケンス(集合 : グループボックス内のラジオボタン)となる。
緑線がLINQの提供する Single() メソッドで、ラムダ式を満たす唯一のオブジェクトを結果として返す。